/*
 * Copyright 2002-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.context.annotation;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 在处理@{@link Configuration}类时，由注册额外Bean定义的类型实现的接口。
 * 处理@{@link Configuration}类。当需要或有必要在Bean定义
 * 级别（相对于{@code @Bean}方法/实例级别）的操作是需要的或必要的。
 *
 * 与{@code @Configuration}和{@link ImportSelector}一起，
 * 这种类型的班级可以被提供给@{@link Import}注解（或者也可以从一个{@code ImportSelector}）。)
 *
 * 一个{@link ImportBeanDefinitionRegistrar}可以实现以下的任何一项{@link org.springframework.beans.factory.Aware Aware}接口，
 * 并且它们各自的方法将在{@link #registerBeanDefinitions}之前被调用。
 * <ul>
 * <li>{@link org.springframework.context.EnvironmentAware EnvironmentAware}</li>
 * <li>{@link org.springframework.beans.factory.BeanFactoryAware BeanFactoryAware}
 * <li>{@link org.springframework.beans.factory.BeanClassLoaderAware BeanClassLoaderAware}
 * <li>{@link org.springframework.context.ResourceLoaderAware ResourceLoaderAware}
 * </ul>
 *
 * 或者，该类可以提供一个单一的构造函数，其中包括一个或多个以下支持的参数类型
 * <ul>
 * <li>{@link org.springframework.core.env.Environment Environment}</li>
 * <li>{@link org.springframework.beans.factory.BeanFactory BeanFactory}</li>
 * <li>{@link java.lang.ClassLoader ClassLoader}</li>
 * <li>{@link org.springframework.core.io.ResourceLoader ResourceLoader}</li>
 * </ul>
 *
 * 参见实现和相关的单元测试，了解使用实例。
 *
 * @author Chris Beams
 * @author Juergen Hoeller
 * @since 3.1
 * @see Import
 * @see ImportSelector
 * @see Configuration
 */
public interface ImportBeanDefinitionRegistrar {

	/**
	 * 基于给定的注解元数据，在必要时注册Bean定义。
	 * 导入的{@code @Configuration}类。
	 * 注意，{@link BeanDefinitionRegistryPostProcessor}类型可能不会被注册。
	 * 由于与{@code @Configuration}有关的生命周期限制，在这里注册类的处理。
	 * 默认的实现是委托给
	 * {@link #registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry)}.
	 * @param importingClassMetadata annotation metadata of the importing class
	 * @param registry current bean definition registry
	 * @param importBeanNameGenerator the bean name generator strategy for imported beans:
	 * {@link ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR} by default, or a
	 * user-provided one if {@link ConfigurationClassPostProcessor#setBeanNameGenerator}
	 * has been set. In the latter case, the passed-in strategy will be the same used for
	 * component scanning in the containing application context (otherwise, the default
	 * component-scan naming strategy is {@link AnnotationBeanNameGenerator#INSTANCE}).
	 * @since 5.2
	 * @see ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR
	 * @see ConfigurationClassPostProcessor#setBeanNameGenerator
	 */
	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
			BeanNameGenerator importBeanNameGenerator) {

		registerBeanDefinitions(importingClassMetadata, registry);
	}

	/**
	 * 基于给定的注解元数据，在必要时注册Bean定义。
	 * 导入的{@code @Configuration}类。
	 * 请注意，{@link BeanDefinitionRegistryPostProcessor}类型可能不被注册。
	 * 由于与{@code @Configuration}有关的生命周期限制，
	 * 在这里注册类的处理。
	 * 默认实现是空的。
	 * @param importingClassMetadata annotation metadata of the importing class
	 * @param registry current bean definition registry
	 */
	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
	}

}
